package com.estatistica.controle;

import java.io.IOException;
import java.util.Arrays;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.estatistica.entidade.DadosAmostra;
import com.estatistica.entidade.DadosFrequencia;
import com.estatistica.entidade.DadosGeraTabela;
import com.estatistica.entidade.DadosPopulacao;
import com.estatistica.util.Util;

@WebServlet("/EstatisticaControle")
public class EstatisticaControle extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	private DadosGeraTabela dadosGeraTabela;
	private int[] dadosOrdenados;
	private int NumValores;

	private DadosPopulacao dadosPopulacao;
	private DadosAmostra dadosAmostra;
	private DadosFrequencia dadosFrequencia;
	private DadosFrequenciaControle dadosFrequenciaControle;
	private PopulacaoControle populacaoControle;
	private AmostraControle amostraControle;
	private DadosTabelaControle dadosTabelaControle;

	public DadosGeraTabela getDadosGeraTabela() {
		return dadosGeraTabela;
	}

	public void setDadosGeraTabela(DadosGeraTabela dadosGeraTabela) {
		this.dadosGeraTabela = dadosGeraTabela;
	}

	public int getNumValores() {
		return NumValores;
	}

	public void setNumValores(int numValores) {
		NumValores = numValores;
	}

	public int[] getDadosOrdenados() {
		Arrays.sort(dadosOrdenados, 0, getNumValores());
		return dadosOrdenados;
	}

	public void setDadosOrdenados(int[] dadosOrdenados) {
		this.dadosOrdenados = dadosOrdenados;
	}

	public DadosTabelaControle getDadosTabelaControle() {
		return dadosTabelaControle;
	}

	public void setDadosTabelaControle(DadosTabelaControle dadosTabelaControle) {
		this.dadosTabelaControle = dadosTabelaControle;
	}

	public DadosPopulacao getDadosPopulacao() {
		return dadosPopulacao;
	}

	public void setDadosPopulacao(DadosPopulacao dadosPopulacao) {
		this.dadosPopulacao = dadosPopulacao;
	}

	public PopulacaoControle getPopulacaoControle() {
		return populacaoControle;
	}

	public void setPopulacaoControle(PopulacaoControle populacaoControle) {
		this.populacaoControle = populacaoControle;
	}
	
	public DadosAmostra getDadosAmostra() {
		return dadosAmostra;
	}

	public void setDadosAmostra(DadosAmostra dadosAmostra) {
		this.dadosAmostra = dadosAmostra;
	}

	public AmostraControle getAmostraControle() {
		return amostraControle;
	}

	public void setAmostraControle(AmostraControle amostraControle) {
		this.amostraControle = amostraControle;
	}

	public DadosFrequencia getDadosFrequencia() {
		return dadosFrequencia;
	}

	public void setDadosFrequencia(DadosFrequencia dadosFrequencia) {
		this.dadosFrequencia = dadosFrequencia;
	}

	public DadosFrequenciaControle getDadosFrequenciaControle() {
		return dadosFrequenciaControle;
	}

	public void setDadosFrequenciaControle(
			DadosFrequenciaControle dadosFrequenciaControle) {
		this.dadosFrequenciaControle = dadosFrequenciaControle;
	}

	public EstatisticaControle() {
		super();
		dadosGeraTabela = new DadosGeraTabela();
		dadosPopulacao = new DadosPopulacao();
		dadosAmostra = new DadosAmostra();
		populacaoControle = new PopulacaoControle();
		amostraControle = new AmostraControle();
		dadosTabelaControle = new DadosTabelaControle();
		dadosFrequencia = new DadosFrequencia();
		dadosFrequenciaControle = new DadosFrequenciaControle();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String dados = request.getParameter("valores").trim();

		String valores[] = new String[Util.MAX_SIZE];
		valores = dados.split("\\s+");

		setNumValores(valores.length);

		dadosOrdenados = new int[Util.MAX_SIZE];
		fillVetorOrdenado(valores);
		
		/* Tabela */

		getDadosGeraTabela().setValorR(getDadosTabelaControle().getValorR(getDadosOrdenados(), getNumValores()));
		getDadosGeraTabela().setValorK(getDadosTabelaControle().getValorK(getNumValores()));
		getDadosGeraTabela().setValorH(getDadosTabelaControle().getValorH(
				getDadosGeraTabela().getValorR(),	getDadosGeraTabela().getValorK()));
		getDadosGeraTabela().setMenorValor(getDadosTabelaControle().getMenorValor(getDadosOrdenados()));

		request.setAttribute("r", getDadosGeraTabela().getValorR());
		request.setAttribute("k", getDadosGeraTabela().getValorK());
		request.setAttribute("h", getDadosGeraTabela().getValorH());
		request.setAttribute("menorValor", getDadosGeraTabela().getMenorValor());
		request.setAttribute("numValores", getNumValores());
		
		getDadosFrequencia().setVetorFi(getDadosFrequenciaControle().getValoresFi(
				getDadosOrdenados(), getNumValores(), getDadosGeraTabela().getValorH(), getDadosGeraTabela().getValorK()));
		getDadosFrequencia().setVetorXi(getDadosFrequenciaControle().getValoresXi(
				getDadosGeraTabela().getMenorValor(), getDadosGeraTabela().getValorH(), getDadosGeraTabela().getValorK()));
		getDadosFrequencia().setVetorFac(getDadosFrequenciaControle().getValoresFac(getDadosFrequencia().getVetorFi(), 
				getDadosGeraTabela().getValorK()));
		getDadosFrequencia().setVetorFiPer(getDadosFrequenciaControle().getValoresFiPerc(
				getDadosFrequencia().getVetorFi(), getDadosGeraTabela().getValorK(), getNumValores()));
		getDadosFrequencia().setVetorFacR(getDadosFrequenciaControle().getValoresFacR(getDadosFrequencia().getVetorFiPer(), 
				getDadosGeraTabela().getValorK()));

		request.setAttribute("vetFi", getDadosFrequencia().getVetorFi());
		request.setAttribute("vetXi", getDadosFrequencia().getVetorXi());
		request.setAttribute("vetFac", getDadosFrequencia().getVetorFac());
		request.setAttribute("vetFiPerc", getDadosFrequencia().getVetorFiPer());
		request.setAttribute("vetFacR", getDadosFrequencia().getVetorFacR());
		
		
		/* Dados Amostra */

		getDadosFrequencia().setValorFiXi(getDadosFrequenciaControle().getValorFiXi(getDadosFrequencia().getVetorFi(),
				getDadosFrequencia().getVetorXi()));
		getDadosAmostra().setMedia(getAmostraControle().getMedia(getDadosFrequencia().getValorFiXi(), getNumValores()));
		getDadosFrequencia().setValorFiD2(getDadosFrequenciaControle().getValorFiD2(getDadosFrequencia().getVetorXi(), 
				getDadosFrequencia().getVetorFi(), getDadosAmostra().getMedia()));
		
		getDadosAmostra().setDesvioPadrao(getAmostraControle().getDesvioPadrao(getDadosFrequencia().getValorFiD2(), getNumValores()));
		getDadosAmostra().setVariancia(getAmostraControle().getVariancia(getDadosFrequencia().getValorFiD2(), getNumValores()));
		getDadosAmostra().setCoefVariacao(getAmostraControle().getCoefVariacao(getDadosAmostra().getDesvioPadrao(), getDadosAmostra().getMedia()));
		getDadosAmostra().setMediaGeometrica(getAmostraControle().getMediaGeometrica(getDadosFrequencia().getVetorXi(), 
				getDadosFrequencia().getVetorFi(), getNumValores()));
		
		request.setAttribute("mediaAmostra",getDadosAmostra().getMedia());
		request.setAttribute("desvioPAmostra",getDadosAmostra().getDesvioPadrao());
		request.setAttribute("varianciaAmostra",getDadosAmostra().getVariancia());
		request.setAttribute("coefAmostra",getDadosAmostra().getCoefVariacao());
		request.setAttribute("mediaGeoAmostra",getDadosAmostra().getMediaGeometrica());
		
		
		/* Dados Populacao */

		getDadosPopulacao().setMedia(getPopulacaoControle().getMedia(getDadosOrdenados(), getNumValores()));
		getDadosPopulacao().setMediaGeometrica(getPopulacaoControle().getMediaGeometrica(getDadosOrdenados(), getNumValores()));
		getDadosPopulacao().setMediana(getPopulacaoControle().getMediana(getDadosOrdenados(), getNumValores()));
		getDadosPopulacao().setModa(getPopulacaoControle().getModa(getDadosOrdenados(),	getNumValores()));
		
		getDadosPopulacao().setDesvioPadrao(getPopulacaoControle().getDesvioPadrao(getDadosOrdenados(), getDadosPopulacao().getMedia(), getNumValores()));
		getDadosPopulacao().setVariancia(getPopulacaoControle().getVariancia(getDadosPopulacao().getDesvioPadrao()));
		getDadosPopulacao().setCoefVariacao(getPopulacaoControle().getCoefVariacao(getDadosPopulacao().getDesvioPadrao(), getDadosAmostra().getMedia()));
		
		request.setAttribute("media", getDadosPopulacao().getMedia());
		request.setAttribute("mediaGeom", getDadosPopulacao().getMediaGeometrica());
		request.setAttribute("mediana", getDadosPopulacao().getMediana());
		request.setAttribute("moda", getDadosPopulacao().getModa());
		request.setAttribute("desvioPPopul",getDadosPopulacao().getDesvioPadrao());
		request.setAttribute("varianciaPopul",getDadosPopulacao().getVariancia());
		request.setAttribute("coefPopul",getDadosPopulacao().getCoefVariacao());
		
				
		RequestDispatcher view = request.getRequestDispatcher("index.jsp");
		view.forward(request, response);
	}

	private void fillVetorOrdenado(String[] dados) {
		for (int i = 0; i < dados.length; i++) {
			this.dadosOrdenados[i] = Integer.parseInt(dados[i]);
		}
	}

}
